package org.lql.algo.codecrush.week004;

import java.util.Stack;

/**
 * @author: liangqinglong
 * @date: 2025-08-01 17:46
 * @description: 面试题 16.26. 计算器 <a href="https://leetcode.cn/problems/calculator-lcci/description/">...</a>
 **/
public class Calculate {

	/**
	 * 给定一个包含正整数、加(+)、减(-)、乘(*)、除(/)的算数表达式(括号除外)，计算其结果。
	 * <p>
	 * 表达式仅包含非负整数，+， - ，*，/ 四种运算符和空格  。 整数除法仅保留整数部分。
	 * <p>
	 * 示例 1：
	 * <p>
	 * 输入："3+2*2"
	 * 输出：7
	 * 示例 2：
	 * <p>
	 * 输入：" 3/2 "
	 * 输出：1
	 * 示例 3：
	 * <p>
	 * 输入：" 3+5 / 2 "
	 * 输出：5
	 * 说明：
	 * <p>
	 * 你可以假设所给定的表达式都是有效的。
	 * 请不要使用内置的库函数 eval。
	 */
	public int calculate(String s) {
		if (s == null || s.isEmpty()) {
			return 0;
		}
		Stack<Integer> stack = new Stack<>();
		int num = 0;
		char sign = '+'; // 默认加号，第一次默认为加号，数字直接入栈
		int n = s.length();
		for (int i = 0; i < n; i++) {
			char c = s.charAt(i);

			// 解析数字
			if (Character.isDigit(c)) {
				num = num * 10 + (c - '0');
			}

			// 如果是操作符 或 已到达末尾
			if ((!Character.isDigit(c) && c != ' ') || i == n - 1) {
				switch (sign) {
					case '+':
						stack.push(num);
						break;
					case '-':
						stack.push(-num);
						break;
					case '*':
						stack.push(stack.pop() * num);
						break;
					case '/':
						stack.push(stack.pop() / num);
						break;
				}

				sign = c;
				num = 0;
			}
		}

		int result = 0;
		for (int number : stack) {
			result += number;
		}

		return result;
	}

	public static void main(String[] args) {
		Calculate calculate = new Calculate();
		System.out.println(calculate.calculate("93+2*2"));
		System.out.println(calculate.calculate(" 3/2 "));
		System.out.println(calculate.calculate(" 3+5 / 2 "));
	}
}
